/**
 * 
 */
package com.zw.cc.redis;

import redis.clients.jedis.ShardedJedis;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface ShardedJedisSentinelOperations {

	/**
	 * 执行回调服务
	 */
	<T> T execute(ConnectionCallback<T, ShardedJedis> action);

	/**
	 * 判断当前key是否存在
	 */
	boolean exist(final String key) ;

	/**
	 * 设置一个key的过期时间（单位：秒）
	 * 
	 * @param key
	 *            key值
	 * @param seconds
	 *            多少秒后过期
	 * @return 1：设置了过期时间 0：没有设置过期时间/不能设置过期时间
	 */
	long expire(final String key, final int seconds) ;

	/**
	 * 设置一个key在某个时间点过期
	 * 
	 * @param key
	 *            key值
	 * @param unixTime
	 *            unix时间戳，从1970-01-01 00:00:00开始到现在的秒数
	 * @return 1：设置了过期时间 0：没有设置过期时间/不能设置过期时间
	 */
	long expireAt(final String key, final long unixTime) ;

	/**
	 * 设置key-value
	 */
	boolean set(final String key, final String value) ;

	/**
	 * 设置key-value，并设置该键的过期时间
	 */
	boolean set(final String key, final String value, final int second) ;

	/**
	 * 获取指定键对应的值
	 */
	String get(final String key) ;

	String get(String key, String defaultValue) ;

	Object getValue(String key) ;

	Long ttl(String key) ;

	boolean setbit(String key, long offset, boolean value) ;

	boolean getbit(String key, long offset) ;

	long setRange(String key, long offset, String value) ;

	String getRange(String key, long startOffset, long endOffset) ;
	
	String substr(String key, int start, int end);

	/**
	 * 删除指定的键
	 */
	boolean del(final String key) ;

	long incr(String key) ;

	long decr(String key) ;

	String type(String key) ;

	/**
	 * 检查Set长度
	 * 
	 * @param key
	 * @return
	 */
	long countSet(final String key) ;

	/**
	 * 添加到Set中
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	boolean addSet(final String key, final String... value) ;

	/**
	 * 添加到Set中（同时设置过期时间）
	 * 
	 * @param key
	 *            key值
	 * @param seconds
	 *            过期时间 单位s
	 * @param value
	 * @return 成功true
	 */
	boolean addSet(final String key, final int seconds, final String... value) ;

	/**
	 * @param key
	 * @param value
	 * @return 判断值是否包含在set中
	 */
	boolean containsInSet(final String key, final String value) ;

	/**
	 * 获取Set
	 * 
	 * @param key
	 * @return
	 */
	Set<String> getSet(final String key) ;

	/**
	 * 从set中删除value
	 * 
	 * @param key
	 * @return
	 */
	boolean removeSetValue(final String key, final String... value) ;

	/**
	 * 从list中删除value
	 * 
	 * @param key
	 * @param count
	 *            要删除个数
	 * @param value
	 * @return
	 */
	boolean removeListValue(final String key, final long count, final String value) ;

	/**
	 * 从list中删除value
	 * 
	 * @param key
	 * @param count
	 * @param values
	 *            值list
	 * @return
	 */
	int removeListValue(final String key, final long count, final List<String> values) ;

	/**
	 * 从list中删除value 默认count 1
	 * 
	 * @param key
	 * @param values
	 *            值list
	 * @return
	 */
	int removeListValue(final String key, final List<String> values) ;

	/**
	 * list分页操作
	 */
	List<String> rangeList(final String key, final long start, final long end) ;

	/**
	 * 截断List
	 * 
	 * @param key
	 *            列表key
	 * @param start
	 *            开始位置 从0开始
	 * @param end
	 *            结束位置
	 * @return 状态码
	 */
	String trimList(final String key, final long start, final long end) ;

	/**
	 * 检查List长度
	 * 
	 * @param key
	 * @return
	 */
	long countList(final String key) ;

	/**
	 * 列表添加元素
	 */
	long rpush(final String key, final String... values) ;

	/**
	 * 添加到List
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	boolean addList(final String key, final String... value) ;

	/**
	 * 添加到List(只新增)
	 * 
	 * @param key
	 * @param list
	 * @return
	 */
	boolean addList(final String key, final List<String> list) ;

	/**
	 * 添加到List中（同时设置过期时间）
	 * 
	 * @param key
	 *            key值
	 * @param seconds
	 *            过期时间 单位s
	 * @param value
	 * @return
	 */
	boolean addList(final String key, final int seconds, final String... value) ;

	/**
	 * 获取List
	 * 
	 * @param key
	 * @return
	 */
	List<String> getList(final String key) ;

	/**
	 * 设置HashSet对象
	 * 
	 * @param domain
	 *            域名
	 * @param key
	 *            键值
	 * @param value
	 *            Json String or String value
	 * @return
	 */
	boolean setHSet(final String key, final String domain, final String value) ;

	boolean setHmSet(String key, Map<String, String> map) ;

	Map<String, String> hgetAll(String key) ;

	/**
	 * 获得HashSet对象
	 * 
	 * @param domain
	 *            域名
	 * @param key
	 *            键值
	 * @return Json String or String value
	 */
	String getHSet(final String key, final String domain) ;

	/**
	 * 删除HashSet对象
	 * 
	 * @param domain
	 *            域名
	 * @param key
	 *            键值
	 * @return 删除的记录数
	 */
	long delHSet(final String key, final String... domain) ;

	/**
	 * 判断key是否存在
	 * 
	 * @param domain
	 *            域名
	 * @param key
	 *            键值
	 * @return
	 */
	boolean existsHSet(final String key, final String domain) ;

	/**
	 * 全局扫描hset
	 * 
	 * @param match
	 *            field匹配模式
	 * @return
	 */
	List<Map.Entry<String, String>> scanHSet(final String domain, final String match) ;

	/**
	 * 返回 domain 指定的哈希集中所有字段的value值
	 * 
	 * @param domain
	 * @return
	 */
	List<String> hvals(final String domain) ;

	/**
	 * 返回 domain 指定的哈希集中所有字段的key值
	 * 
	 * @param domain
	 * @return
	 */
	Set<String> hkeys(final String domain) ;

	/**
	 * 返回 domain 指定的哈希key值总数
	 * 
	 * @param domain
	 * @return
	 */
	long lenHset(final String domain) ;

	/**
	 * 设置排序集合
	 * 
	 * @param key
	 * @param score
	 * @param value
	 * @return
	 */
	boolean setSortedSet(final String key, final long score, final String value) ;

	/**
	 * 获得排序集合
	 * 
	 * @param key
	 * @param startScore
	 * @param endScore
	 * @param orderByDesc
	 * @return
	 */
	Set<String> getSortedSet(final String key, final long startScore, final long endScore, final boolean orderByDesc) ;

	/**
	 * 计算排序长度
	 * 
	 * @param key
	 * @param startScore
	 * @param endScore
	 * @return
	 */
	long countSortedSet(final String key, final long startScore, final long endScore) ;

	/**
	 * 删除排序集合
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	boolean delSortedSet(final String key, final String value) ;

	Long zremrangeByScore(String key, double start, double end) ;

    /**
	 * 获得排序集合
	 * 
	 * @param key
	 * @param startRange
	 * @param endRange
	 * @param orderByDesc
	 * @return
	 */
	Set<String> getSortedSetByRange(final String key, final int startRange, final int endRange, final boolean orderByDesc) ;

	/**
	 * 获得排序打分
	 * 
	 * @param key
	 * @return
	 */
	Double getScore(String key, String member) ;

    Long zcard(String key) ;
}
